package com.leyou.client.item;

import com.leyou.common.pojo.PageResult;
import com.leyou.item.dto.SeckillGoodsDTO;
import com.leyou.item.dto.SpecGroupDTO;
import com.leyou.item.dto.SpuDTO;
import com.leyou.item.pojo.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 商品远程接口
 */
@FeignClient("item-service") // 需要调用服务名称
public interface ItemClient {

    /**
     * 分页查询商品
     */
    @GetMapping("/spu/page")
    public PageResult<SpuDTO> findSpuByPage(
            @RequestParam(value = "page",defaultValue = "1") Integer page,
            @RequestParam(value = "rows",defaultValue = "5") Integer rows,
            @RequestParam(value = "key",required = false) String key,
            @RequestParam(value = "saleable",required = false) Boolean saleable
    );

    /**
     * 根据spuId查询所有Sku
     */
    @GetMapping("/sku/of/spu")
    public List<Sku> findSkusBySpuId(@RequestParam("id") Long id);

    /**
     * 根据规格组(分类，是否为搜索条件)查询规格参数
     */
    @GetMapping("/spec/params")
    public List<SpecParam> findSpecParams(
            @RequestParam(value = "gid",required = false) Long gid,
            @RequestParam(value = "cid",required = false) Long cid,
            @RequestParam(value = "searching",required = false) Boolean searching
    );

    /**
     * 根据spuId查询SpuDetail
     */
    @GetMapping("/spu/detail")
    public SpuDetail findSpuDetialBySpuId(@RequestParam("id") Long id);

    /**
     * 根据分类id集合 查询 分类对象集合
     */
    @GetMapping("/category/list")
    public List<Category> findCategoriesByIds(@RequestParam("ids") List<Long> ids);

    /**
     * 根据id集合查询品牌集合
     */
    @GetMapping("/brand/list")
    public List<Brand> findBrandsByIds(@RequestParam("ids") List<Long> ids);

    /**
     * 根据spuId查询SpuDTO对象
     */
    @GetMapping("/spu/{id}")
    public SpuDTO findSpuById(@PathVariable("id") Long id);

    /**
     * 根据id查询品牌
     */
    @GetMapping("/brand/{id}")
    public Brand findBrandById(@PathVariable("id") Long id);

    /**
     * 根据分类id查询规格组（包含组内参数）
     */
    @GetMapping("/spec/of/category")
    public List<SpecGroupDTO> findSpecGroupDtoByCid(@RequestParam("id") Long id);

    /**
     * 根据skuId集合查询Sku对象集合
     */
    @GetMapping("/sku/list")
    public List<Sku> findSkusByIds(@RequestParam("ids") List<Long> ids);

    /**
     * 扣减商品的库存量
     */
    @PutMapping("/stock/minus")
    // 参数格式：  {"1111":10,"2222":20}
    Void minusStock(@RequestBody Map<Long, Integer> paramMap);

    /**
     * 增加商品的库存量
     */
    @PutMapping("/stock/plus")
    // 参数格式：  {"1111":10,"2222":20}
    Void plusStock(@RequestBody Map<Long, Integer> paramMap);


    /**
     * 查询全部分类数据
     */
    @GetMapping("/category/findAll")
    Map<String, List<Category>> findAll();

    /**
     * 查询商品的库存量
     */
    @PostMapping("/stock/check")
    void checkStock(@RequestBody Map<Long, Integer> resultMap);



    /**
     * 收藏
     * @param skuId
     * @param userId
     * @return
     */
    @PostMapping("/favorite")
    public ResponseEntity<Integer> favoriteGoods(@RequestParam("skuId") Long skuId, @RequestParam("userId") Long userId);

    /**
     * 查询用户收藏
     * @param id
     * @return
     */
    @GetMapping("/getFavorite")
    public List<Sku> findUserFavorite(@RequestParam("id") Long id);


    /**
     * 查询秒杀商品列表
     */
    @GetMapping("/seckill/findAllSeckill")
    List<SeckillGoods> findAllSeckill();

    /**
     * 扣减秒杀的库存量
     */
    /**
     * 减库存
     */
    @PutMapping("/seck/minus")
    Void minusSeckillStock(@RequestParam("skuId") Long skuId);


    /**
     * 秒杀商品详情页
     */
    @GetMapping("/seck/sku/{id}")
    SeckillGoodsDTO findSeckSkuById(@PathVariable("id") Long id);
}
